package br.uniceub.fsw.talentos.facade;

import br.uniceub.fsw.arquitetura.persistencia.transacao.Transacao;
import br.uniceub.fsw.arquitetura.servico.exception.NegocioException;
import br.uniceub.fsw.seguranca.facade.LoginFacade;
import br.uniceub.fsw.talentos.dao.TalentoDAO;
import br.uniceub.fsw.talentos.dao.ExperienciaDAO;
import br.uniceub.fsw.talentos.vo.ExperienciaVO;
import br.uniceub.fsw.talentos.vo.TalentoVO;
import br.uniceub.fsw.util.TabelaHtml;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.DateFormat;
import java.util.Date;
/**
 *
 * @author Carol
 */
public class ExperienciaFacade {

    private String message;

    private ExperienciaVO experiencia;

    private TalentoVO talento;

    private ExperienciaDAO experienciaDao;

    /*private ExperienciaBO experienciaBo; */


    public ExperienciaFacade() {
        this.experienciaDao = new ExperienciaDAO();
        /*this.experienciaBo = new ExperienciaBO();*/
    }

    public String getMessage() {
        String retorno = null;
        if(this.message == null || this.message.equals("")) {
            retorno = "&nbsp";
        } else {
            retorno = this.message;
        }
        return retorno;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public void operacao(HttpServletRequest req, HttpServletResponse resp) {
        String oper = req.getParameter("operacao");

        if(oper != null)
        {
            if (oper.equals("consultar")) {
                this.consultar(req, resp);
            }
            if (oper.equals("incluir")) {
                this.incluir(req, resp);
            }
            if (oper.equals("alterar")) {
                this.alterar(req, resp);
            }
            if (oper.equals("excluir")) {
                this.excluir(req, resp);
            }
            if (oper.equals("recarregar")) {
                this.recarregar(req, resp);
            }
           if (oper.equals("confirmar")) {
                this.confirmar(req, resp);
            }
        }
    }

    public ExperienciaVO getExperiencia() {
        return this.experiencia;
    }

    public void setExperiencia(ExperienciaVO experiencia) {
        this.experiencia = experiencia;
    }

    public TalentoVO getTalento() {
        return talento;
    }

    public void setTalento(TalentoVO talento) {
        this.talento = talento;
    }

    public void consultar(HttpServletRequest req, HttpServletResponse resp) {
        String idExperienciaTmp = req.getParameter("idExperiencia");

        Integer idExperiencia = null;

        if(idExperienciaTmp == null || idExperienciaTmp.equals("")) {
            return;
        } else {
            idExperiencia = Integer.parseInt(idExperienciaTmp);
        }

        this.experiencia = experienciaDao.consultarPorId(idExperiencia);
    }

    public void incluir(HttpServletRequest req, HttpServletResponse resp) {
        String cdTalento = req.getParameter("cdTalento");
        String noEmpresa = req.getParameter("noEmpresa");
        String dsCargo = req.getParameter("dsCargo");
        String dsFuncao = req.getParameter("dsFuncao");
        String dsAtividade = req.getParameter("dsAtividade");
        String dtEntrada = req.getParameter("dtEntrada");
        String dtSaida = req.getParameter("dtSaida");

        experiencia = new ExperienciaVO();
        experiencia.setCdTalento(cdTalento==null?null:cdTalento==""?null:Integer.parseInt(cdTalento));
        experiencia.setNoEmpresa(noEmpresa);
        experiencia.setDsCargo(dsCargo);
        experiencia.setDsFuncao(dsFuncao);
        experiencia.setDsAtividade(dsAtividade);

        String mensagem = null;

        try {
            experiencia.setDtEntrada(validaData(dtEntrada));
        } catch (Exception e) {
            mensagem = "Informe uma data de entrada válida.";
        }

        try {
            experiencia.setDtSaida(validaData(dtSaida));
        } catch (Exception e) {
            mensagem = "Informe uma data de saída válida.";
        }

        // Validações da BO
        /*
        try {
            experienciaBo.validarVOUnico(experiencia);
        } catch(NegocioException ex) {
            mensagem = ex.getMessage();
        }
         * */

        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                experienciaDao.inserir(experiencia);

                Transacao.efetivar();

                mensagem = "Experiência incluída com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na inclusão da experiência: " + ex.getMessage();

                experiencia = null;
            }
        } else {
            experiencia = null;
        }

        this.message = mensagem;
    }

    /**
     * Alterar uma experiencia.
     *
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void alterar(HttpServletRequest req, HttpServletResponse resp) {
        String idExperiencia = req.getParameter("idExperiencia");
        String cdTalento = req.getParameter("cdTalento");
        String noEmpresa = req.getParameter("noEmpresa");
        String dsCargo = req.getParameter("dsCargo");
        String dsFuncao = req.getParameter("dsFuncao");
        String dsAtividade = req.getParameter("dsAtividade");
        String dtEntrada = req.getParameter("dtEntrada");
        String dtSaida = req.getParameter("dtSaida");

        experiencia = new ExperienciaVO();
        experiencia.setIdExperiencia(idExperiencia==null?null:Integer.parseInt(idExperiencia));
        experiencia.setCdTalento(cdTalento==null?null:Integer.parseInt(cdTalento));
        experiencia.setNoEmpresa(noEmpresa);
        experiencia.setDsCargo(dsCargo);
        experiencia.setDsFuncao(dsFuncao);
        experiencia.setDsAtividade(dsAtividade);

        String mensagem = null;

        try {
            experiencia.setDtEntrada(validaData(dtEntrada));
        } catch (Exception e) {
            mensagem = "Informe uma data de entrada válida.";
        }

        try {
            experiencia.setDtSaida(validaData(dtSaida));
        } catch (Exception e) {
            mensagem = "Informe uma data de saída válida.";
        }

        if(mensagem == null || mensagem.equals("")) {
            try {
                Transacao.iniciar();

                experienciaDao.alterar(experiencia);

                Transacao.efetivar();

                mensagem = "Experiência alterada com sucesso.";
            } catch (Exception ex) {
                Transacao.desfazer();

                mensagem = "Problema na alteração da experiência: " + ex.getMessage();
            }
        } else {
            experiencia = null;
        }

        this.message = mensagem;
    }

     /**
     * Excluir uma experiencia.
     *
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void excluir(HttpServletRequest req, HttpServletResponse resp) {
        String idExperiencia = req.getParameter("idExperiencia");

      
        String mensagem = null;

        experiencia = new ExperienciaVO();

        try {
            experiencia.setIdExperiencia(Integer.parseInt(req.getParameter("idExperiencia")));
        }
        catch (NumberFormatException e) {
            mensagem = "ID da experiencia inválido";
        }

        if(mensagem == null) {
            try {
                Transacao.iniciar();
                new ExperienciaDAO().excluir(experiencia);
                Transacao.efetivar();
                mensagem = "Experiência excluída com sucesso.";
            }
            catch (Exception ex) {
                mensagem = "Problema na exclusão da experiência: " + ex.getMessage();
            }
        }

        this.experiencia = null;

        this.message = mensagem;
    }

    /**
     * Recarregar a página após alguma ação de seleção de combo.
     *
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void recarregar(HttpServletRequest req, HttpServletResponse resp) {
        String idTalento = req.getParameter("idTalento");
        String idExperiencia = req.getParameter("idExperiencia");

        TalentoDAO talentoDao = new TalentoDAO();

        if (idTalento != null && !idTalento.isEmpty()) {
            talento = talentoDao.consultarPorId(idTalento);
        }

        if (idExperiencia != null && !idExperiencia.isEmpty()) {
            experiencia = experienciaDao.consultarPorId(idExperiencia);
        }
    }

    /**
     * Confirmar a exclusão de experiencia.
     *
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     */
    public void confirmar(HttpServletRequest req, HttpServletResponse resp) {
        String idExperiencia = req.getParameter("idExperiencia");
        String noEmpresa = req.getParameter("noEmpresa");

        experiencia = new ExperienciaVO();
        experiencia.setIdExperiencia(Integer.parseInt(idExperiencia));
        experiencia.setNoEmpresa(noEmpresa);
    }

    /**
     * Retorna uma lista de experiencia ordenada por nome
     *
     * @return lista com as informações necessárias
     */

    /*
    public List<List> consultarExperienciasPorNome(HttpServletRequest req, HttpServletResponse resp) {
        String idTalento_tmp = req.getParameter("cdTalento");

        Integer idTalento = (idTalento_tmp == null || idTalento_tmp.equals(""))?null:Integer.parseInt(idTalento_tmp);

        List<List> lista = new ArrayList<List>();

        ExperienciaDAO experienciaDao = new ExperienciaDAO();

        List<ExperienciaVO> experiencias = experienciaDao.consultarExperienciaOrdenadoPorNomeEmpresa(idTalento);
        

        for(int i = 0; i < experiencias.size(); i++) {
            List<String> registro = new ArrayList<String>();
            registro.add(experiencias.get(i).getIdExperiencia().toString());
            registro.add(experiencias.get(i).getNoEmpresa());

            lista.add(registro);
        }

        return lista;
    }
     */

     /**
     * Retorna uma lista de experiencias a partir de parâmetros da tela
     *
     * @param req Requisição web do tipo HTTP.
     * @param resp Resposta da requisição HTTP.
     * @return objeto tabela com as informações necessárias
     */
    public TabelaHtml consultarExperiencias(HttpServletRequest req, HttpServletResponse resp) {
        String nome = req.getParameter("cdTalento");

        if(nome != null && !nome.equals("")) {
            TabelaHtml tabela = new TabelaHtml();

            tabela.setCampoRetorno("idExperienia");

            tabela.adicionarTitulo("Id");
            tabela.adicionarTamanho(0);
            tabela.adicionarTipo("Integer");
            tabela.adicionarStatus(false);

            tabela.adicionarTitulo("Nome");
            tabela.adicionarTamanho(80);
            tabela.adicionarTipo("String");
            tabela.adicionarStatus(true);

            tabela.gravarCampos();

            ExperienciaVO exemplo = new ExperienciaVO();

            exemplo.setCdTalento(Integer.parseInt(nome));
            List<ExperienciaVO> experiencias = experienciaDao.consultarPorExemplo(exemplo);



            // Adiciona os valores de cada experiencia nas listas de ids e nomes
            for(int i = 0; i < experiencias.size(); i++) {
                tabela.adicionarRegistro(converterVoParaString(experiencias.get(i)));
            }

            return tabela;
        }

        return null;
    }

    
    /**
     * Transforma os campos de um VO em uma lista de Strings
     *
     * @return lista de strings com os valores em ordem
     */
    public List<String> converterVoParaString(ExperienciaVO experiencia) {
        List<String> valores = new ArrayList<String>();

        valores.add(experiencia.getIdExperiencia().toString());
        valores.add(experiencia.getNoEmpresa());
        valores.add(experiencia.getCdTalento().toString());
        valores.add(experiencia.getDsCargo());
        valores.add(experiencia.getDsFuncao());
        valores.add(experiencia.getDsAtividade());
        valores.add(experiencia.getDtEntrada().toString());
        valores.add(experiencia.getDtSaida().toString());


        return valores;
    }

    public Date validaData(String data) throws Exception {
        try {
            DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);
            return df.parse(data);
        } catch (java.text.ParseException pe) {
            throw new Exception("Informe uma data válida");

        }
    }


}